/**
 *
 * 一、抽象类和接口的主要区别
 * 从设计层面来说，抽象类是对类的抽象，是一种模板设计；接口是行为的抽象，是一种行为的规范。
 * <p>
 * 一个类可以有多个接口只能有继承一个父类
 * 抽象类可以有[构造方法]，接口中不能有构造方法。
 * 抽象类中可以有[普通成员变量]，接口中没有普通成员变量，只能有[常量]。
 * 接口里边全部方法都必须是abstract的；抽象类的可以有实现了的方法。
 * 抽象类中的抽象方法的访问类型可以是public、protected；但接口中的抽象方法只能是public类型的，并且默认即为public abstract类型。
 * 抽象类中可以包含静态方法，接口中不能包含静态方法
 * 抽象类和接口中都可以包含静态成员变量，抽象类中的静态成员变量的访问类型可以任意；但接口中定义的变量只能是public static final类型，并且默认即为public static final类型。
 * <p>
 * Java8中接口中引入默认方法和静态方法，以此来减少抽象类和接口之间的差异。
 * <p>
 * 接口和抽象类各有优缺点，在接口和抽象类的选择上，必须遵守这样一个原则：
 * 行为模型应该总是通过接口而不是抽象类定义，所以通常是优先选用接口，尽量少用抽象类。
 * 选择抽象类的时候通常是如下情况：需要定义子类的行为，又要为子类提供通用的功能。
 * <p>
 * 二、说一说你对抽象类的理解吧，他到底是干啥用的
 * 我们常说面向对象的核心思想是：先抽象，后具体。抽象类是含有抽象方法的类，不能被实例化，抽象类常用作当做[模板类]使用。
 * 接口更多的是在系统架构设计方法发挥作用，主要用于定义模块之间的[通信契约]。
 * 而抽象类在代码实现方面发挥作用，可以实现代码的重用，例如，模板方法设计模式是抽象类的一个典型应用。
 * <p>
 * 三、用抽象类实现一个接口，和普通类实现接口会有什么不同么？
 * 一般来说我们使用普通类来实现接口，这个普通类就必须实现接口中所有的方法，这样的结果就是普通类中就需要实现多余的方法，造成代码冗余。但是如果我们使用的是抽象类来实现接口，那么就可以只实现接口中的部分方法，并且当其他类继承这个抽象类时，仍然可以实现接口中有但抽象类并未实现的方法。
 * 如：抽象类B只是实现了接口A中的方法a、b，但是当类C继承抽象类B时，可以直接实现接口A中的c方法，有一点需要注意的是，类C中的方法a、b都是调用的父类B的方法a、b，不是直接实现接口的方法a和b。
 * <p>
 * 四、抽象类能使用final修饰吗？
 * 不能，定义抽象类就是让其他类继承的，如果定义为final该类就不能被继承，这样彼此就会产生矛盾，所以final不能修饰抽象类。
 *
 * @author guodd
 * @version 1.0 use jdk 1.8
 */
package ch03_oothinking.abstractuse;